package models

import (
	"order_srv/basic/config"
	"time"
)

// 用户消息
type UserMessage struct {
	Id        uint64    `gorm:"column:id;type:bigint UNSIGNED;comment:消息ID;primaryKey;not null;" json:"id"`                         // 消息ID
	UserId    uint32    `gorm:"column:user_id;type:int UNSIGNED;comment:接收用户ID（关联users表）;not null;" json:"user_id"`                 // 接收用户ID（关联users表）
	Title     string    `gorm:"column:title;type:varchar(100);comment:消息标题;not null;" json:"title"`                                 // 消息标题
	Content   string    `gorm:"column:content;type:text;comment:消息内容;not null;" json:"content"`                                     // 消息内容
	RelatedId int64     `gorm:"column:related_id;type:bigint;comment:关联业务ID（如任务ID/订单ID）;default:NULL;" json:"related_id"`           // 关联业务ID（如任务ID/订单ID）
	MsgType   int8      `gorm:"column:msg_type;type:tinyint;comment:消息类型：1-订单通知 2-系统通知 3-导出任务通知;not null;" json:"msg_type"`         // 消息类型：1-订单通知 2-系统通知 3-导出任务通知
	IsRead    bool      `gorm:"column:is_read;type:tinyint;comment:是否已读：0-未读 1-已读;not null;default:0;" json:"is_read"`              // 是否已读：0-未读 1-已读
	CreatedAt time.Time `gorm:"column:created_at;type:datetime;comment:创建时间;not null;default:CURRENT_TIMESTAMP;" json:"created_at"` // 创建时间
	ReadAt    time.Time `gorm:"column:read_at;type:datetime;comment:阅读时间;default:NULL;" json:"read_at"`                             // 阅读时间
}

// TableName 表名定义
func (u *UserMessage) TableName() string {
	return "user_message"
}

// Create 保存消息到数据库
func (u *UserMessage) Create() error {
	return config.DB.Create(u).Error
}

// MarkAsRead 标记消息为已读
func (u *UserMessage) MarkAsRead() error {
	now := time.Now()
	return config.DB.Model(u).Where("id = ?", u.Id).Updates(map[string]interface{}{
		"is_read": true,
		"read_at": now,
	}).Error
}

// GetUnreadCount 获取用户未读消息数
func GetUnreadCount(userID uint32) (int64, error) {
	var count int64
	err := config.DB.Model(&UserMessage{}).
		Where("user_id = ? AND is_read = ?", userID, false).
		Count(&count).Error
	return count, err
}
